package vip.liux.contracts.models.point;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;
import lombok.Getter;
import lombok.Setter;
import vip.liux.domain.entities.auditing.AuditedEntity;

import java.math.BigDecimal;

/**
 * 用户积分账户实体类
 * 表示用户的积分账户信息，包括可用积分、冻结积分和已过期积分。
 */
@Getter
@Setter
@Entity
@Table(name = "shop_points_account", uniqueConstraints = {
        @UniqueConstraint(columnNames = "user_id", name = "uk_user_id")
})
public class PointsAccount extends AuditedEntity<Long> {

    /**
     * 用户ID
     * 唯一标识用户，与数据库中的user_id字段映射。
     */
    @Column(name = "user_id", nullable = false)
    private Long userId;

    /**
     * 可用积分
     * 表示用户当前可用的积分数量，默认为0。
     */
    @Column(name = "available_points", nullable = false)
    private BigDecimal availablePoints = BigDecimal.ZERO;

    /**
     * 冻结积分
     * 表示用户当前被冻结的积分数量，默认为0。
     */
    @Column(name = "frozen_points", nullable = false)
    private BigDecimal frozenPoints = BigDecimal.ZERO;

    /**
     * 已过期积分
     * 表示用户已过期的积分数量，默认为0。
     */
    @Column(name = "expired_points", nullable = false)
    private BigDecimal expiredPoints = BigDecimal.ZERO;

    /**
     * 冻结积分
     * 将指定数量的可用积分冻结。如果可用积分不足，则抛出异常。
     *
     * @param points 要冻结的积分数量
     * @throws IllegalStateException 如果可用积分不足
     */
    public void freezePoints(BigDecimal points) {
        if (this.availablePoints.compareTo(points) < 0) {
            throw new IllegalStateException("可用积分不足");
        }
        this.availablePoints = this.availablePoints.subtract(points);
        this.frozenPoints = this.frozenPoints.add(points);
    }
}